'use client'; import { useState, useEffect, useCallback } from 'react'; import { fetchApi } from '@/lib/utils/client'; import { useStudioContext } from '@/app/studio/context'; import type { CrewWidgetConfigResponse, CrewWidgetConfigItem } from '@/types/response/crew/widgetConfig'; import { CREW_PERIODS, CREW_WIDGET_THEMES } from '../../widget/constants'; import { type FormState, createEmptyForm, formatDateTime } from '../../widget/types'; import CrewWidgetFormPanel from '../../widget/_components/CrewWidgetFormPanel'; import CrewWidgetPreviewPanel from '../../widget/_components/CrewWidgetPreviewPanel'; import { Button } from '@/components/ui/button'; import { Checkbox } from '@/components/ui/checkbox'; import { Separator } from '@/components/ui/separator'; type Props = { crewID: number }; // eslint-disable-next-line @typescript-eslint/no-unused-vars export default function CrewWidgetTab({ crewID: _crewID }: Props) { const { channelID } = useStudioContext(); const [items, setItems] = useState([]); const [loading, setLoading] = useState(true); const [saving, setSaving] = useState(false); const [editItem, setEditItem] = useState(null); const [showForm, setShowForm] = useState(false); const [selected, setSelected] = useState>(new Set()); const [form, setForm] = useState(createEmptyForm()); const fetchList = useCallback(() => { if (!channelID) { setLoading(false); return; } setLoading(true); fetchApi(`/api/studio/crew/widget/config/${channelID}`) .then(res => setItems(res.data?.list ?? [])) .catch(() => {}) .finally(() => setLoading(false)); }, [channelID]); useEffect(() => { fetchList(); }, [fetchList]); const getPeriodLabel = (p: number) => CREW_PERIODS.find(x => x.value === p)?.label ?? '-'; const getThemeLabel = (t: number) => CREW_WIDGET_THEMES.find(x => x.value === t)?.label ?? '-'; const openAdd = () => { setEditItem(null); setForm(createEmptyForm()); setShowForm(true); }; const openEdit = (item: CrewWidgetConfigItem) => { setEditItem(item); setShowForm(true); }; const handleSaved = () => { setShowForm(false); setEditItem(null); fetchList(); }; const toggleSelect = (id: number) => { setSelected(prev => { const next = new Set(prev); if (next.has(id)) { next.delete(id); } else { next.add(id); } return next; }); }; const handleBatchDelete = async () => { if (selected.size === 0) { return; } if (!confirm(`${selected.size}개 설정을 삭제하시겠습니까?`)) { return; } for (const id of selected) { try { await fetchApi(`/api/studio/crew/widget/config/${id}/${channelID}`, { method: 'DELETE' }); } catch { } } setSelected(new Set()); fetchList(); }; if (loading) { return

준비 중...

; } if (showForm) { return ( <>

{editItem ? '위젯 수정' : '위젯 추가'}

setShowForm(false)} channelID={channelID ?? undefined} saving={saving} setSaving={setSaving} />
); } return (

위젯 설정 ({items.length}개)

{selected.size > 0 && ( )}
{items.length === 0 ? ( ) : items.map(item => ( ))}
0 && selected.size === items.length} onCheckedChange={() => setSelected(items.length === selected.size ? new Set() : new Set(items.map(i => i.id)))} /> 제목 기간 테마 최대 표시 활성 작업
등록된 위젯 설정이 없습니다.
toggleSelect(item.id)} /> {item.title} {getPeriodLabel(item.period)} {item.period === 5 && item.startAt && item.endAt && (
{formatDateTime(item.startAt)} ~ {formatDateTime(item.endAt)}
)}
{getThemeLabel(item.theme)} {item.maxDisplayCount}명 {item.isActive ? '활성' : '비활성'}
); }